#!/usr/bin/env python3
"""
蜜罐管理器
"""
import asyncio
import subprocess
from pathlib import Path

from .logger import op_logger

class HoneypotManager:
    """
    蜜罐管理器，用于协调和管理所有协议处理器
    """

    def __init__(self, handlers):
        """
        初始化蜜罐管理器

        Args:
            handlers (list): 协议处理器列表
        """
        self.handlers = handlers

    async def start(self):
        """
        启动所有协议处理器
        """
        op_logger.info("启动蜜罐管理器，包含 %d 个处理器", len(self.handlers))
        # 并发启动处理器
        await asyncio.gather(*(h.start() for h in self.handlers))
        op_logger.info("所有处理器已启动")

    async def stop(self):
        """
        停止所有协议处理器
        """
        op_logger.info("停止蜜罐管理器")
        await asyncio.gather(*(h.stop() for h in self.handlers), return_exceptions=True)

# ---------------------- 工具函数：通过openssl生成自签名证书 -----
def ensure_self_signed(certfile: Path, keyfile: Path, common_name: str = "mini-honeypot.local"):
    """
    如果文件缺失，尝试使用openssl命令生成自签名证书。
    需要在PATH中有openssl可用。

    Args:
        certfile (Path): 证书文件路径
        keyfile (Path): 密钥文件路径
        common_name (str): 证书通用名称

    Returns:
        bool: 生成成功返回True，否则返回False
    """
    if certfile.exists() and keyfile.exists():
        op_logger.info("找到现有证书/密钥: %s %s", certfile, keyfile)
        return True

    # 尝试运行openssl
    cmd = [
        "openssl", "req", "-x509", "-nodes", "-days", "365",
        "-newkey", "rsa:2048",
        "-keyout", str(keyfile),
        "-out", str(certfile),
        "-subj", f"/CN={common_name}"
    ]
    try:
        op_logger.info("通过openssl生成自签名证书...")
        subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        op_logger.info("生成证书/密钥于 %s %s", certfile, keyfile)
        return True
    except Exception as e:
        op_logger.error("使用openssl生成证书/密钥失败: %s", e)
        return False
